package top.hudk.other;

/**
 * 功能或业务描述：值交换的三种形式对比
 * 创建时间：2021/6/18 9:42
 * 作者：hudk
 */
public class ValueExchangeTest {


    public static void main(String[] args) {
        test();
    }

    /**
     * 测试三种交换变量的方法各自的运行时间效率
     */
    public static void test(){
        //待交换的连个变量
        long n = 34156236589564L;
        long m = 65485695632451L;
        //循环50亿次
        long count = 5000000000L;
        //实时次数
        long i = 0;
        //中间变量
        long temp;
        long t1 = System.currentTimeMillis();
        //【第一种方式】
        //借用中间变量交换
        //这种变量交换的方式语义上相对好理解
        //通过测试，运行效率在这三种当中相对最好
        while (i < count){
            temp = n;
            n = m;
            m = temp;
            i++;
        }
        i = 0;
        long t2 = System.currentTimeMillis();
        //【第二种方式】
        //用加减法变量交换
        //这种方式容易产生溢出
        //通过测试，运行效率相对第一种较差
        while (i < count){
            n = n + m;
            m = n - m;
            n = n - m;
            i++;
        }
        i = 0;
        long t3 = System.currentTimeMillis();
        //【第三种方式】
        //借用异或变量交换
        //使用位运算来实现变量的交换
        //通过测试，运行效率相对第一种较差，相对第二种几乎一样
        while (i < count){
            n = n ^ m;
            m = n ^ m;
            n = n ^ m;
            i++;
        }
        long t4 = System.currentTimeMillis();
        System.out.println("借用中间变量交换所花时间：" + (t2 - t1));
        System.out.println("用加减法变量交换所花时间：" + (t3 - t2));
        System.out.println("借用异或变量交换所花时间：" + (t4 - t3));
    }

}
